let net = require("net");
let ws = require("ws"); //websocket

//客户端发送给node的数据包列表
let clientMessage = [];
//java发送给node的数据包列表
let serverMessage = [];

//node和手机连接的websocket对象
let wsClient = null;
//node和java服务器连接的socket对象
let sock = null;

//服务端数据列表长度
function serverMsgLength() {
  return serverMessage.length;
}
//保存客户端发来的数据到serverMessage数据列表
function pushServerMsg(msg) {
  serverMessage.push(msg);
}
//从serverMessage数据列表中读取数据
function shiftServerMsg() {
  return serverMessage.shift();
}

//初始化socket连接(node和java)
function initSocket() {
  console.log('初始化socket通信');
  sock = net.connect({
    port: 8899,
    host: "47.110.66.45",
  }, function () {
    console.log('connected to server!');
  });
  sock.setEncoding('utf8');
  //连接成功调用的事件
  sock.on("connect", function () {
    console.log('与java服务器成功建立连接');
    console.log("socket connect success");
    //把clientMessage中的数据发送到java
    for (; clientMsgLength() > 0;) {
      //客户端有数据需要发送给java
      let msg = shiftClientMsg();
      console.log('准备发送给java的数据包:\n' + msg);
      sock.write(msg);
    }
  });
  // 有错误发生调用的事件
  sock.on("error", function (e) {
    console.log("socket error", e);
    sock.destroy();
  });
  // socket关闭的事件
  sock.on("close", function () {
    console.log(" socket close");
    sock = null;//socket连接对象设置为null
    // setTimeout(() => {
    //   initSocket();
    // }, 3000);
  });
  // 对方发送了关闭数据包过来的事件
  sock.on("end", function () {
    console.log("socket end event");
  });
  // 从java收到数据包
  sock.on("data", function (data) {
    console.log('服务器 => ' + data);
    //把数据保存到serverMessage数据列表
    pushServerMsg(data);
    //判断客户端和node之间的连接是否建立
    if (wsClient === null) {
      console.log('客户端已经断开连接');
    } else {
      for (; serverMsgLength() > 0;) {
        //java有数据要发送给node
        let msg = shiftServerMsg();
        // console.log('准备发送给node的数据包:\n'+msg);
        wsClient.send(msg);
      }
    }
    //收到java项目的数据,转发给Node项目

    // wsClient.send(data);
  });
}

// initSocket();

/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////

// 启动websocket服务器
let wsServer = new ws.Server({
  host: "0.0.0.0",
  port: 9000,
});
//收到来自客户端的连接请求
wsServer.on("connection", on_server_client_comming);
// 建立连接，监听客户端请求，绑定对应事件;
function on_server_client_comming(wsObj) {
  console.log("收到来自客户端的连接请求，连接成功");
  websocket_add_listener(wsObj);
  wsClient = wsObj;
}

//客户端数据列表长度
function clientMsgLength() {
  return clientMessage.length;
}
//保存客户端发来的数据到clientMessage数据列表
function pushClientMsg(msg) {
  clientMessage.push(msg);
}
//从clientMessage数据列表中读取数据
function shiftClientMsg() {
  return clientMessage.shift();
}

// 各事件处理逻辑
function websocket_add_listener(wsObj) {
  //收到客户端信息事件
  wsObj.on("message", function (data) {
    console.log("客户端 => " + data);
    //把数据保存到clientMessage
    pushClientMsg(data);
    //判断node和java之间的连接是否建立
    if (sock === null) {
      //建立node和java之间的连接
      initSocket();
    } else {
      console.log('sock已经建立');
      //把clientMessage中的数据发送到java
      for (; clientMsgLength() > 0;) {
        //客户端有数据需要发送给java
        let msg = shiftClientMsg();
        // console.log('准备发送给java的数据包:\n'+msg);
        sock.write(msg);
      }
    }
  });
  //关闭连接事件
  wsObj.on("close", function (e) {
    console.log('websocket 断开: ' + e.code + ' '
      + e.reason + ' ' + e.wasClean);
    console.log("e=" + e);
    console.log(e);
    console.log("request close");
    if (sock != null) {
      sock.end();//向服务器发送断开连接的请求
    } else {
      console.log("连接java的sock已经删除了，这是因为有多个客户端连接了websocket，然后多个连接断开，所以会触发多次close，但是本项目只允许同时启动一个app");
    }
    wsClient = null;//websocket连接对象设置为null
  });
  //连接错误事件
  wsObj.on("error", function (err) {
    console.log("request error", err);
  });
}